import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.sql.Types;
import java.util.HashMap;

/**
 * @Author: lmf
 * @Create: 2024/4/13 14:27
 * Description:
 */
public class createdCode {
    // 包名
    private final String packageName = "com.mf";
    // 需要生成的表
    private final  String tableName = "t_purchase_record";
    // mysql
    private final String mysqlUrl = "192.168.8.21:3309/stock-main";
    private final String  mysqlName = "root";
    private final String  mysqlPwd = "aA4881351";
    // 前缀

    // 定义数据库连接URL
    private final String url = "jdbc:mysql://"+this.mysqlUrl+"?characterEncoding=utf8&useSSL=false&serverTimezone=GMT" +
            "%2B8" +
            "&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true";

    // 作者
    private final String author = "mf";


    /**
     * 使用FastAutoGenerator自动化生成代码的主函数。
     *
     * @param args 命令行参数（未使用）
     */
    public static void main(String[] args) {
        final createdCode createdCode = new createdCode();
        createdCode.createdEntity("/stock-model/src/main/", "");
        createdCode.createdController("/stock-api/src/main/", "");
        createdCode.createdService("/stock-service/src/main/", "");
        createdCode.createdMapper("/stock-mapper/src/main/", "");
    }
    /**
     * 生成mapper
     * @param pkgPath 指定输出目录
     * @param path 设置entity包名
     */
    private  void  createdMapper(String pkgPath,String path){
        String _path = System.getProperty("user.dir") + pkgPath + "java";
        String PkgXml = System.getProperty("user.dir")+pkgPath+"resources/mapper"+path;
        // 开始生成代码
        FastAutoGenerator.create(this.url, this.mysqlName, this.mysqlPwd)
                .globalConfig(builder -> {
                    // 全局配置
                    builder.author(author) // 设置作者
                            .disableOpenDir() // 禁止自动打开输出目录
                            .outputDir(_path); // 指定输出目录
                })
                .packageConfig(builder -> {
//                    // 设置包配置
                    builder.parent(packageName)
                            .mapper("mapper" + path) // 设置包名
                            .pathInfo(new HashMap<OutputFile, String>(){{
                                put(OutputFile.xml, PkgXml); // 设置xml输出路径
                            }}); // 设置父包名
                })
                .strategyConfig(builder -> {
                    // 设置策略配置
                    builder
                            .addInclude(this.tableName) // 设置需要生成的表名
                            .addTablePrefix("sys_", "t_") // 设置过滤表前缀
                            .serviceBuilder();

                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker模板引擎
                // 模板配置
                .templateConfig(
                        builder -> builder.disable().mapper("/templates/mapper.java")
                                .xml("/templates/mapper.xml") // mapper.xml.ftl
                )
                .execute(); // 执行生成操作
    }



    /**
     * 生成服务层
     * @param pkgPath 指定输出目录
     * @param path 设置entity包名
     */
    private  void  createdService(String pkgPath,String path){
        String _path = System.getProperty("user.dir") + pkgPath + "java";
        // 开始生成代码
        FastAutoGenerator.create(this.url, this.mysqlName, this.mysqlPwd)
                .globalConfig(builder -> {
                    // 全局配置
                    builder.author(author) // 设置作者
                            .disableOpenDir() // 禁止自动打开输出目录
                            .outputDir(_path); // 指定输出目录
                })
                .packageConfig(builder -> {
//                    // 设置包配置
                    builder.parent(packageName)
                            .service("service" + path); // 设置controller包名
                })
                .strategyConfig(builder -> {
                    // 设置策略配置
                    builder
                            .addInclude(this.tableName) // 设置需要生成的表名
                            .addTablePrefix("sys_", "t_") // 设置过滤表前缀
                            .serviceBuilder();

                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker模板引擎
                // 模板配置
                .templateConfig(
                        builder -> builder.disable().service("/templates/service.java").serviceImpl("/templates/serviceImpl.java")
                )
                .execute(); // 执行生成操作
    }

    /**
     * 生成控制层
     * @param pkgPath 指定输出目录
     * @param controllerPath 设置entity包名
     */
    private  void  createdController(String pkgPath,String controllerPath){
        String path = System.getProperty("user.dir") + pkgPath + "java";
        // 开始生成代码
        FastAutoGenerator.create(this.url, this.mysqlName, this.mysqlPwd)
                .globalConfig(builder -> {
                    // 全局配置
                    builder.author(author) // 设置作者
                            .disableOpenDir() // 禁止自动打开输出目录
                            .outputDir(path); // 指定输出目录
                })
                .packageConfig(builder -> {
//                    // 设置包配置
                    builder.parent(packageName)
                            .controller("controller" + controllerPath); // 设置controller包名
                })
                .strategyConfig(builder -> {
                    // 设置策略配置
                    builder
                            .addInclude(this.tableName) // 设置需要生成的表名
                            .addTablePrefix("sys_", "t_") // 设置过滤表前缀
                            .entityBuilder()
                            .enableLombok(); // 启用 Lombok 注解

                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker模板引擎
                // 模板配置
                .templateConfig(
                        builder -> builder.disable().controller("/templates/controller.java")
                )
                .execute(); // 执行生成操作
    }


    /**
     * 生成实体类
     * @param pkgPath 指定输出目录
     * @param entityPath 设置entity包名
     */
    private  void  createdEntity(String pkgPath,String entityPath){
        String path = System.getProperty("user.dir") + pkgPath + "java";
        // 开始生成代码
        FastAutoGenerator.create(this.url, this.mysqlName, this.mysqlPwd)
                .globalConfig(builder -> {
                    // 全局配置
                    builder.author(author) // 设置作者
                            .disableOpenDir() // 禁止自动打开输出目录
                            .outputDir(path); // 指定输出目录
                })
                .packageConfig(builder -> {
                    // 包配置
                    // 这里假设entityPath是相对于包名的路径，用于确定实体类应该放在哪个子包下
                    builder.parent(this.packageName)
                            .moduleName(entityPath); // 设置模块名，即子包名，用于存放生成的实体类
                })
                .strategyConfig(builder -> {
                    // 设置策略配置
                    builder
                            .addInclude(this.tableName) // 设置需要生成的表名
                            .addTablePrefix("sys_", "t_") // 设置过滤表前缀
                            .entityBuilder()
                            .enableLombok(); // 启用 Lombok 注解

                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker模板引擎
                // 模板配置
                .templateConfig(
                        builder -> builder
                                .disable()
                                .entity("/templates/entity.java")
                )
                .execute(); // 执行生成操作
    }

}
